#include <sys/time.h>
#include "app_common.h"
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "log.h"

/**
 * @brief 获取当前时间戳
 */
long app_common_get_curtime_ts()
{
    // 获取当前时间戳
    struct timeval tv;
    // 获取当前时间
    gettimeofday(&tv, NULL);
    // 秒*1000 + 微秒/1000
    return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

/**
 * @brief 把字符打印为16进制字符串
 */
void app_common_print_hex(char *data, int len)
{
    for (int i = 0; i < len; i++)
    {
        printf("%02x ", data[i]);
    }
    printf("\n");
}

/**
 * @brief 把字符打印为16进制字符串 返回为字符串
 */
char *app_common_bytes_to_hexstr(char *data, int len)
{
    char *hexstr = (char *)malloc(len * 2 + 1);
    int i = 0;
    /* data[3]={0x61,0x62,0x63}
     */
    for (i = 0; i < len; i++)
    { // 循环三次
        // 第一次 把0x61转换为"61" 以此类推
        sprintf(hexstr + i * 2, "%02x", data[i]);
    }
    hexstr[i * 2] = '\0';
    return hexstr;
}

/**
 * @brief 把16进制字符串转换为字符数组
 * @param hexstr 16进制字符串
 * @param byte_buf 字节数组的容器
 * @param buf_len 字节数组的长度
 * @return 转换后的字节数组长度
 */
int app_common_hexstr_to_bytes(char *hexstr, char *byte_buf, int buf_len)
{
    int i = 0; //"616263"
    //获得16进制字符数组个数
    int len = strlen(hexstr);
    //如果大于咱们的缓冲区就错误
    if (len / 2 > buf_len)
    {
        log_error("hexstr_to_bytes error: hexstr len > buf_len");
        return -1;
    }

    for (i = 0; i <len; i+=2)
    {
        //hexstr[0]="61" 的数据向byte_buf[0]写入 0x61  
        sscanf(hexstr + i , "%2hhx", &byte_buf[i/2]);
    }
    return len/2;
}
